<?php

namespace App\Services;

use App\Models\Module as Model;
use App\Models\Site;

class ModuleService
{
    public function all()
    {
        //获取子模块集合
        $modules = \Module::toCollection();
        //返回子模块的名称
        return $modules->map(function ($module) {
            return $this->find($module->getName());
        });
    }

    public function allInstall()
    {
        return $this->all()->filter(function ($module) {
            return $module['installed'];
        });
    }
//$config和module放在同一层（最外层）。
    public function find(string $name)
    {
        // 通过名称找模块
        $module = \Module::find($name);
        //通过路径组合找配置文件，
        $config = $this->config($module, 'config');
        $model = Model::where('name', $name)->first();

        //通过配置文件找数据库中是否安装。
        return $config + [
                //Model::where('name',$name)会返回collection集合，exists()是否存在
                'preview' => '/modules/' . $name . '/static/preview.jpg',
                'id' => $model['id'] ?? 0,
                'installed' => (bool)$model,
                'menus' => $this->menu($module),
                'module' => $module
            ];
    }

//获取平台位子模块提供的公共目录
    public function menu($module)
    {

        return array_merge((include __DIR__ . '/data/menus.php'), $this->config($module, 'menus'));


    }

    public function config($module, $name)
    {
        return include $module->getPath() . '/Config/' . $name . '.php';
    }

    //获取用户选中的模块
    public function getSiteSingleModules(Site $site)
    {
        return $site->module ? $this->find($site->module->name) : null;

    }

    //获取用户组所有模块
    public function getSiteModules(Site $site)
    {
        return $site->master->group->modules->map(function ($module) {
            return $this->find($module['name']);
        });

    }

  //也可以通过暂存session中来判定点击的路由是否在当前栏目中
    public function hasRoute(array $menu)
    {
        return collect($menu['items'])->map(function ($value) {
            return $value['route'] ?? '';
        })->contains(url()->current());
    }

}
